package com.aps.server.context;

import cn.hutool.core.collection.CollUtil;
import com.aps.server.entity.*;
import dev.langchain4j.agent.tool.P;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 校验上下文
 * 用于缓存从数据库查询的基础数据，避免重复查询
 *
 * 核心功能：
 * 1. 批量加载基础数据（产品、工艺、工序、设备）
 * 2. 构建Map索引，提供快速查找
 * 3. 校验数据完整性，返回缺失的数据
 * 4. 减少数据库查询，提升性能
 *
 * @Author nbZhuozh
 * @Date 2025-10-14  10:52
 **/
@Slf4j
@Data
public class ValidateContext {

    // ==================== 数据存储（Map索引） ====================

//    /**
//     * 产品数据 Map
//     * Key: 产品编号 (productCode)
//     * Value: 产品对象
//     */
//    private Map<String, BasicProduct> productMap;
//
//    /**
//     * 工艺数据 Map
//     * Key: 产品ID (craftProductId)
//     * Value: 该产品的工艺列表
//     */
//    private Map<String, List<ApsCraft>> craftMap;
//
//    /**
//     * 工序数据 Map
//     * Key: 工艺ID (craftId)
//     * Value: 该工艺的工序列表
//     */
//    private Map<String, List<ApsOperation>> operationMap;
//
//    /**
//     * 设备数据 Map
//     * Key: 设备类型 (equipType)
//     * Value: 该类型的设备列表
//     */
//    private Map<String, List<BasicEquip>> equipMap;

    // ==================== 原始List数据（用于兼容） ====================

    /**
     * 订单数据列表
     */
    public List<ApsOrder> orders;

    /**
     * 产品数据列表
     */
    public List<BasicProduct> products;

    /**
     * 工艺数据列表
     */
    public List<ApsCraft> apsCrafts;

    /**
     * 工序数据列表
     */
    public List<ApsOperation> apsOperations;

    /**
     * 设备数据列表
     */
    public List<BasicEquip> equips;

    // ==================== 构造函数 ====================

    /**
     * 构造函数
     * 初始化所有Map和List
     */
    public ValidateContext() {
        this.orders = new ArrayList<>();
        this.products = new ArrayList<>();
        this.apsCrafts = new ArrayList<>();
        this.apsOperations = new ArrayList<>();
        this.equips = new ArrayList<>();
    }

    // ==================== 核心校验方法 ====================

    /**
     * 校验产品数据
     * 返回产品编码在上下文中不存在的产品
     */
    public List<String> validateProducts(List<String> productCodes) {
        if(CollectionUtils.isEmpty(products)){
            return productCodes;
        }
        List<String> dataSourceProductCodes = products.stream().map(BasicProduct::getProductCode).toList();
        return productCodes.stream().filter(i->{
            return !dataSourceProductCodes.contains(i);
        }).toList();
    }

    public List<String> validateCrafts(List<String> productIds) {
        if(CollectionUtils.isEmpty(apsCrafts)){
            return productIds;
        }
        List<String> datasourceCraftProductIds = apsCrafts.stream().map(ApsCraft::getCraftProductId).distinct().toList();
        return productIds.stream().filter(i->{
            return !datasourceCraftProductIds.contains(i);
        }).toList();
    }

    public List<String> validateOptions(List<String> craftIds) {
        if(CollectionUtils.isEmpty(apsOperations)){
            return craftIds;
        }
        List<String> datasourceCraftIds = apsOperations.stream().map(ApsOperation::getCraftId).distinct().toList();
        return craftIds.stream().filter(i->{
            return !datasourceCraftIds.contains(i);
        }).toList();
    }

}
